import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
import qs from 'qs'

const request = axios.create({
  timeout: 2000,
  headers: {
    'Content-Type': 'application/json'
  }
})

function getBaseURL (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagounews.com'
  } else {
    return 'http://edufront.lagounews.com'
  }
}

function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

request.interceptors.request.use(function (config) {
  // 根据config.url的前缀 设置baseURL
  config.baseURL = getBaseURL(config.url)

  // 设置token
  const { user } = store.state
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }

  return config
})

// 存储是否正在更新token 状态
let isRefreshing = false
// 存储因为等待token刷新而挂起的请求
const requests = []

// 设置响应拦截器
request.interceptors.response.use(function (response) {
  return response
}, function (error) {
  if (error.response) {
    // 响应接收成功，状态为失败
    let errorMessage = ''
    const { status } = error.response
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // 1.无Token
      if (!store.state.user) {
        redirectLogin()
        return Promise.reject(error)
      }

      // 检测是否已经存在刷新token的请求
      if (isRefreshing) {
        // 保存当前失败请求到列表
        requests.push(() => {
          request(error.config)
        })
        return
      }
      isRefreshing = true

      // 2.Token无效（错误、过期）
      // 发送请求获取新的token
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // 刷新token失败
        if (res.data.state !== 1) {
          // 清空用户信息
          store.commit('setUser', null)
          // 跳转到登录页
          redirectLogin()
          return Promise.reject(error)
        }
        // 刷新token成功
        store.commit('setUser', res.data.content)

        requests.forEach(callback => callback())
        // 重新发送请求
        //  error.config 本次失败请求的配置对象
        return request(error.config)
      }).catch(err => {
        console.log(err)
      }).finally(() => {
        // 请求完成
        isRefreshing = false
      })
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status >= 500) {
      errorMessage = '服务端错误，请联系管理员'
    }
    Message.error(errorMessage)
  } else if (error.request) {
    // 请求发送成功 未收到响应
    Message.error('请求超时，请重试')
  } else {
    Message.error(error.message)
  }
  return Promise.reject(error)
})

export default request
